package com.chb.weibo3;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.net.URI;
import java.util.HashMap;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileSplit;

/**
 * 第三个mapreduce
 * 将根据第一个和第二个mapreduce
 * 计算的微博总数，TF 
 * 和DF
 * 进行计算得到词条权重。
 * 
 */
public class LastMapper extends Mapper<Text, Text, Text, Text>{
	//通过使用DistributedCache ,将微博总数，和DF统计的文件读入内存中，以map的形式存储
	HashMap<String, Integer> countMap = null;
	HashMap<String, Integer> dfMap = null;
	@Override
	protected void setup(Context context)
			throws IOException, InterruptedException {
		//通过contex获取存在缓存中的文件的uri
		URI[] uris = context.getCacheFiles();
		if (uris != null) {
			for (URI uri : uris) {
				//如何读取文件内容？
				if (uri.getPath().endsWith("part-r-00003")) {//获取微博总数的文件
					System.out.println(uri.getPath());
					Path path = new Path(uri.getPath());
					BufferedReader br = new BufferedReader(new FileReader(path.getName())); 
					countMap = new HashMap<String, Integer>();
					//统计微博总数的文件中只有一行， count  数量
					String line = br.readLine();
					if (line.startsWith("count")) {
						countMap.put("count", Integer.parseInt(line.split("\t")[1]));
					}
					br.close();
				}else if(uri.getPath().endsWith("part-r-00000")){//获取df文件
					Path path = new Path(uri.getPath());
					BufferedReader br = new BufferedReader(new FileReader(path.getName())); 
					dfMap = new HashMap<String, Integer>();
					String line = null;
					while ((line = br.readLine()) != null){
						//line: word 在多少个文章中出现
						String word = line.split("\t")[0];
						String count = line.split("\t")[1];
						dfMap.put(word, Integer.parseInt(count));
					}
					br.close();
				}
			}
		}
	}
	@Override
	protected void map(Text key, Text value, Context context) throws IOException,
	InterruptedException {
		//读取第一个mapreduce的输出结果的TF统计值
		FileSplit fileSplit = (FileSplit) context.getInputSplit();
		if (!fileSplit.getPath().getName().endsWith("part-r-00003")) {
			//每行数据为一个微博中的一个字条的TF
			String w_id = key.toString();
			int num = Integer.parseInt(value.toString());
			//输出每个微博的字条的权重
			double wi = num * Math.log(countMap.get("count")/dfMap.get(w_id.split("_")[0]));

			context.write(new Text(w_id.split("_")[1]), new Text(w_id.split("_")[0]+":"+wi));
		}
	}
}
